home *** CD-ROM | disk | FTP | other *** search
/ ETO Development Tools 1 / ETO Development Tools 1.iso / Essentials / Developer Essentials Jul 90 / Programming / MPW Interfaces & Libraries 3.1 / AIncludes / SANEMacs881.a < prev    next >
Encoding:
Text File  |  1989-10-13  |  27.0 KB  |  1,459 lines  |  [TEXT/MPS ]

  1. ; File: SANEMacs881.a
  2. ;
  3. ; Version 3.0
  4. ; Spawned from SANEMacs.a on 21 Apr 87
  5. ;                             25 Oct 88 now handles 882 frames
  6. ; Copyright Apple Computer, Inc. 1984-1988
  7. ; All Rights Reserved
  8. ;
  9.  
  10. ;  SANE Numerics -- These 881 SANE macros are an enhancement
  11. ;  to the standard SANE macros found in SANEMacs.a; SANE trap
  12. ;  calls are replaced with direct inline MC68881 code.    These
  13. ;  macros are MacII specific, i.e. they take advantage of the
  14. ;  020 and 881.  With the exception of the size of extendeds,
  15. ;  these macros are functionally equivalent to the standard
  16. ;  macros.    By keeping the interface standard but utilizing
  17. ;  96-bit extendeds instead of 80-bits, these macros serve as
  18. ;  a bridge between the old 80-bit software SANE world and
  19. ;  the new 96-bit hardware SANE world.    In addition, these
  20. ;  macros document, for the 020/881 programmer, the access of
  21. ;  SANE routines, such as FRANDX, which aren't found on the
  22. ;  MC68881 and must have their software exceptions mapped to
  23. ;  hardware.
  24.  
  25. ;  YOU MUST RESIZE ALL YOUR 80-BIT EXTENDEDS TO 96-BITS
  26. ;  BEFORE USING THESE MACROS.
  27.  
  28. ;  These 881 SANE macros preserve the 020/881 registers
  29. ;  the same way the standard SANE macros do:  all registers
  30. ;  (except FP0,FP1) are preserved, except that REMAINDER
  31. ;  still returns information in D0 and except that the
  32. ;  scanners and formatter still destroy A0,A1,D0,D1.
  33.  
  34.         MC68881
  35.         MACHINE MC68020
  36.  
  37. ;———————————————————————————————————————————————————————————
  38. ; Operation code masks.
  39. ;———————————————————————————————————————————————————————————
  40. FOADD            EQU  $0000     ; add
  41. FOSUB            EQU  $0002     ; subtract
  42. FOMUL            EQU  $0004     ; multiply
  43. FODIV            EQU  $0006     ; divide
  44. FOCMP            EQU  $0008     ; compare, no exception from unordered
  45. FOCPX            EQU  $000A     ; compare, signal invalid if unordered
  46. FOREM            EQU  $000C     ; remainder
  47. FOZ2X            EQU  $000E     ; convert to extended
  48. FOX2Z            EQU  $0010     ; convert from extended
  49. FOSQRT            EQU  $0012     ; square root
  50. FORTI            EQU  $0014     ; round to integral value
  51. FOTTI            EQU  $0016     ; truncate to integral value
  52. FOSCALB         EQU  $0018     ; binary scale
  53. FOLOGB            EQU  $001A     ; binary log
  54. FOCLASS         EQU  $001C     ; classify
  55. ; UNDEFINED     EQU  $001E
  56.  
  57. FOSETENV        EQU  $0001     ; set environment
  58. FOGETENV        EQU  $0003     ; get environment
  59. FOSETHV         EQU  $0005     ; set halt vector
  60. FOGETHV         EQU  $0007     ; get halt vector
  61. FOD2B            EQU  $0009     ; convert decimal to binary
  62. FOB2D            EQU  $000B     ; convert binary to decimal
  63. FONEG            EQU  $000D     ; negate
  64. FOABS            EQU  $000F     ; absolute
  65. FOCPYSGN        EQU  $0011     ; copy sign
  66. FONEXT            EQU  $0013     ; next-after
  67. FOSETXCP        EQU  $0015     ; set exception
  68. FOPROCENTRY     EQU  $0017     ; procedure entry
  69. FOPROCEXIT        EQU  $0019     ; procedure exit
  70. FOTESTXCP        EQU  $001B     ; test exception
  71. ; UNDEFINED     EQU  $001D
  72. ; UNDEFINED     EQU  $001F
  73.  
  74.  
  75. ;———————————————————————————————————————————————————————————
  76. ; Operand format masks.
  77. ;———————————————————————————————————————————————————————————
  78. FFEXT            EQU  $0000     ; extended -- 80-bit float
  79. FFDBL            EQU  $0800     ; double    -- 64-bit float
  80. FFSGL            EQU  $1000     ; single    -- 32-bit float
  81. FFINT            EQU  $2000     ; integer    -- 16-bit integer
  82. FFLNG            EQU  $2800     ; long int -- 32-bit integer
  83. FFCOMP            EQU  $3000     ; comp     -- 64-bit integer
  84.  
  85. ;———————————————————————————————————————————————————————————
  86. ; Precision code masks: forces a floating point output
  87. ; value to be coerced to the range and precision specified.
  88. ;———————————————————————————————————————————————————————————
  89. FCEXT            EQU  $0000     ; extended
  90. FCDBL            EQU  $4000     ; double
  91. FCSGL            EQU  $8000     ; single
  92.  
  93. ;———————————————————————————————————————————————————————————
  94. ; Operations: operand addresses should already be on
  95. ; the stack, with the destination address on top.  The
  96. ; suffix X, D, S, C, I, or L  determines the format of the
  97. ; source operand -- extended, double, single, comp,
  98. ; integer, or long integer, respectively; the destination
  99. ; operand is always extended.
  100. ;———————————————————————————————————————————————————————————
  101.  
  102.  
  103. ;———————————————————————————————————————————————————————————
  104. ; Addition.
  105. ;———————————————————————————————————————————————————————————
  106.         MACRO
  107.         FADDX
  108.         fmove.x ([4,sp]),fp0
  109.         fadd.x    ([sp]),fp0
  110.         fmove.x fp0,([sp])
  111.         addq    #8,sp
  112.         ENDM
  113.  
  114.         MACRO
  115.         FADDD
  116.         fmove.d ([4,sp]),fp0
  117.         fadd.x    ([sp]),fp0
  118.         fmove.x fp0,([sp])
  119.         addq    #8,sp
  120.         ENDM
  121.  
  122.         MACRO
  123.         FADDS
  124.         fmove.s ([4,sp]),fp0
  125.         fadd.x    ([sp]),fp0
  126.         fmove.x fp0,([sp])
  127.         addq    #8,sp
  128.         ENDM
  129.  
  130.         MACRO
  131.         FADDC
  132.         fmove.x ([sp]),fp1
  133.         jsr _FC2X
  134.         fadd    fp1,fp0
  135.         fmove.x fp0,([sp])
  136.         addq    #8,sp
  137.         ENDM
  138.  
  139.         MACRO
  140.         FADDI
  141.         fmove.w ([4,sp]),fp0
  142.         fadd.x    ([sp]),fp0
  143.         fmove.x fp0,([sp])
  144.         addq    #8,sp
  145.         ENDM
  146.  
  147.         MACRO
  148.         FADDL
  149.         fmove.l ([4,sp]),fp0
  150.         fadd.x    ([sp]),fp0
  151.         fmove.x fp0,([sp])
  152.         addq    #8,sp
  153.         ENDM
  154.  
  155. ;———————————————————————————————————————————————————————————
  156. ; Subtraction.
  157. ;———————————————————————————————————————————————————————————
  158.         MACRO
  159.         FSUBX
  160.         fmove.x ([sp]),fp0
  161.         fsub.x    ([4,sp]),fp0
  162.         fmove.x fp0,([sp])
  163.         addq    #8,sp
  164.         ENDM
  165.  
  166.         MACRO
  167.         FSUBD
  168.         fmove.x ([sp]),fp0
  169.         fsub.d    ([4,sp]),fp0
  170.         fmove.x fp0,([sp])
  171.         addq    #8,sp
  172.         ENDM
  173.  
  174.         MACRO
  175.         FSUBS
  176.         fmove.x ([sp]),fp0
  177.         fsub.s    ([4,sp]),fp0
  178.         fmove.x fp0,([sp])
  179.         addq    #8,sp
  180.         ENDM
  181.  
  182.         MACRO
  183.         FSUBC
  184.         fmove.x ([sp]),fp1
  185.         jsr _FC2X
  186.         fsub    fp0,fp1
  187.         fmove    fp1,fp0
  188.         fmove.x fp0,([sp])
  189.         addq    #8,sp
  190.         ENDM
  191.  
  192.         MACRO
  193.         FSUBI
  194.         fmove.x ([sp]),fp0
  195.         fsub.w    ([4,sp]),fp0
  196.         fmove.x fp0,([sp])
  197.         addq    #8,sp
  198.         ENDM
  199.  
  200.         MACRO
  201.         FSUBL
  202.         fmove.x ([sp]),fp0
  203.         fsub.l    ([4,sp]),fp0
  204.         fmove.x fp0,([sp])
  205.         addq    #8,sp
  206.         ENDM
  207.  
  208. ;———————————————————————————————————————————————————————————
  209. ; Multiplication.
  210. ;———————————————————————————————————————————————————————————
  211.         MACRO
  212.         FMULX
  213.         fmove.x ([4,sp]),fp0
  214.         fmul.x    ([sp]),fp0
  215.         fmove.x fp0,([sp])
  216.         addq    #8,sp
  217.         ENDM
  218.  
  219.         MACRO
  220.         FMULD
  221.         fmove.d ([4,sp]),fp0
  222.         fmul.x    ([sp]),fp0
  223.         fmove.x fp0,([sp])
  224.         addq    #8,sp
  225.         ENDM
  226.  
  227.         MACRO
  228.         FMULS
  229.         fmove.s ([4,sp]),fp0
  230.         fmul.x    ([sp]),fp0
  231.         fmove.x fp0,([sp])
  232.         addq    #8,sp
  233.         ENDM
  234.  
  235.         MACRO
  236.         FMULC
  237.         fmove.x ([sp]),fp1
  238.         jsr _FC2X
  239.         fmul    fp1,fp0
  240.         fmove.x fp0,([sp])
  241.         addq    #8,sp
  242.         ENDM
  243.  
  244.         MACRO
  245.         FMULI
  246.         fmove.w ([4,sp]),fp0
  247.         fmul.x    ([sp]),fp0
  248.         fmove.x fp0,([sp])
  249.         addq    #8,sp
  250.         ENDM
  251.  
  252.         MACRO
  253.         FMULL
  254.         fmove.l ([4,sp]),fp0
  255.         fmul.x    ([sp]),fp0
  256.         fmove.x fp0,([sp])
  257.         addq    #8,sp
  258.         ENDM
  259.  
  260. ;———————————————————————————————————————————————————————————
  261. ; Division.
  262. ;———————————————————————————————————————————————————————————
  263.         MACRO
  264.         FDIVX
  265.         fmove.x ([sp]),fp0
  266.         fdiv.x    ([4,sp]),fp0
  267.         fmove.x fp0,([sp])
  268.         addq    #8,sp
  269.         ENDM
  270.  
  271.         MACRO
  272.         FDIVD
  273.         fmove.x ([sp]),fp0
  274.         fdiv.d    ([4,sp]),fp0
  275.         fmove.x fp0,([sp])
  276.         addq    #8,sp
  277.         ENDM
  278.  
  279.         MACRO
  280.         FDIVS
  281.         fmove.x ([sp]),fp0
  282.         fdiv.s    ([4,sp]),fp0
  283.         fmove.x fp0,([sp])
  284.         addq    #8,sp
  285.         ENDM
  286.  
  287.         MACRO
  288.         FDIVC
  289.         fmove.x ([sp]),fp1
  290.         jsr _FC2X
  291.         fdiv    fp0,fp1
  292.         fmove    fp1,fp0
  293.         fmove.x fp0,([sp])
  294.         addq    #8,sp
  295.         ENDM
  296.  
  297.         MACRO
  298.         FDIVI
  299.         fmove.x ([sp]),fp0
  300.         fdiv.w    ([4,sp]),fp0
  301.         fmove.x fp0,([sp])
  302.         addq    #8,sp
  303.         ENDM
  304.  
  305.         MACRO
  306.         FDIVL
  307.         fmove.x ([sp]),fp0
  308.         fdiv.l    ([4,sp]),fp0
  309.         fmove.x fp0,([sp])
  310.         addq    #8,sp
  311.         ENDM
  312.  
  313. ;———————————————————————————————————————————————————————————
  314. ; Square root.
  315. ;———————————————————————————————————————————————————————————
  316.         MACRO
  317.         FSQRTX
  318.         fsqrt.x ([sp]),fp0
  319.         fmove.x fp0,([sp])
  320.         addq    #4,sp
  321.         ENDM
  322.  
  323. ;———————————————————————————————————————————————————————————
  324. ; Round to integer, according to the current rounding mode.
  325. ;———————————————————————————————————————————————————————————
  326.         MACRO
  327.         FRINTX
  328.         fint.x    ([sp]),fp0
  329.         fmove.x fp0,([sp])
  330.         addq    #4,sp
  331.         ENDM
  332.  
  333. ;———————————————————————————————————————————————————————————
  334. ; Truncate to integer, using round toward zero.
  335. ;———————————————————————————————————————————————————————————
  336.         MACRO
  337.         FTINTX
  338.         fintrz.x    ([sp]),fp0
  339.         fmove.x fp0,([sp])
  340.         addq    #4,sp
  341.         ENDM
  342.  
  343. ;———————————————————————————————————————————————————————————
  344. ; Remainder.        COMPATIBILITY: QUOT is moved to D0
  345. ;———————————————————————————————————————————————————————————
  346.         MACRO
  347.         FREMX
  348.         fmove.x ([sp]),fp0
  349.         frem.x    ([4,sp]),fp0
  350.         fmove.x fp0,([sp])
  351.         fmove    fpsr,d0
  352.         bfextu    d0{8:8},d0
  353.         bpl.s    @1
  354.         bclr    #7,d0
  355.         neg.l    d0
  356. @1        addq    #8,sp
  357.         ENDM
  358.  
  359.         MACRO
  360.         FREMD
  361.         fmove.x ([sp]),fp0
  362.         frem.d    ([4,sp]),fp0
  363.         fmove.x fp0,([sp])
  364.         fmove    fpsr,d0
  365.         bfextu    d0{8:8},d0
  366.         bpl.s    @1
  367.         bclr    #7,d0
  368.         neg.l    d0
  369. @1        addq    #8,sp
  370.         ENDM
  371.  
  372.         MACRO
  373.         FREMS
  374.         fmove.x ([sp]),fp0
  375.         frem.s    ([4,sp]),fp0
  376.         fmove.x fp0,([sp])
  377.         fmove    fpsr,d0
  378.         bfextu    d0{8:8},d0
  379.         bpl.s    @1
  380.         bclr    #7,d0
  381.         neg.l    d0
  382. @1        addq    #8,sp
  383.         ENDM
  384.  
  385.         MACRO
  386.         FREMC
  387.         fmove.x ([sp]),fp1
  388.         jsr _FC2X
  389.         frem    fp0,fp1
  390.         fmove    fp1,fp0
  391.         fmove.x fp0,([sp])
  392.         fmove    fpsr,d0
  393.         bfextu    d0{8:8},d0
  394.         bpl.s    @1
  395.         bclr    #7,d0
  396.         neg.l    d0
  397. @1        addq    #8,sp
  398.         ENDM
  399.  
  400.         MACRO
  401.         FREMI
  402.         fmove.x ([sp]),fp0
  403.         frem.w    ([4,sp]),fp0
  404.         fmove.x fp0,([sp])
  405.         fmove    fpsr,d0
  406.         bfextu    d0{8:8},d0
  407.         bpl.s    @1
  408.         bclr    #7,d0
  409.         neg.l    d0
  410. @1        addq    #8,sp
  411.         ENDM
  412.  
  413.         MACRO
  414.         FREML
  415.         fmove.x ([sp]),fp0
  416.         frem.l    ([4,sp]),fp0
  417.         fmove.x fp0,([sp])
  418.         fmove    fpsr,d0
  419.         bfextu    d0{8:8},d0
  420.         bpl.s    @1
  421.         bclr    #7,d0
  422.         neg.l    d0
  423. @1        addq    #8,sp
  424.         ENDM
  425.  
  426. ;———————————————————————————————————————————————————————————
  427. ; Logb.
  428. ;———————————————————————————————————————————————————————————
  429.         MACRO
  430.         FLOGBX
  431.         fmove.x ([sp]),fp0
  432.         fbne.w    @1
  433.         flog2    fp0
  434.         bra.s    @3
  435. @1        fmove    fpsr,-(sp)
  436.         andi.l    #$02000000,(sp)+
  437.         beq.s    @2
  438.         fabs    fp0
  439.         bra.s    @3
  440. @2        fgetexp fp0,fp0
  441. @3        fmove.x fp0,([sp])
  442.         addq    #4,sp
  443.         ENDM
  444.  
  445. ;———————————————————————————————————————————————————————————
  446. ; Scalb.
  447. ;———————————————————————————————————————————————————————————
  448.         MACRO
  449.         FSCALBX
  450.         jsr     _fprocENTRYsp
  451.         move.w    ([sp]),([sp],2)
  452.         addq.l    #2,(sp)
  453.         MOVE.W    #FFINT+FOSCALB,-(SP)
  454.         _FP68K
  455.         fmove.x fp0,([12,sp])
  456.         jsr     _fprocEXITsp
  457.         ENDM
  458.  
  459. ;———————————————————————————————————————————————————————————
  460. ; Copy-sign.
  461. ;———————————————————————————————————————————————————————————
  462.         MACRO
  463.         FCPYSGNX
  464.         bclr    #7,([4,sp])
  465.         tst.b    ([sp])
  466.         bpl.s    @1
  467.         bset    #7,([sp])
  468. @1        addq.l    #8,sp
  469.         ENDM
  470.  
  471. ;———————————————————————————————————————————————————————————
  472. ; Negate.
  473. ;———————————————————————————————————————————————————————————
  474.         MACRO
  475.         FNEGX
  476.         bchg.b    #7,([sp])
  477.         addq.l    #4,sp
  478.         ENDM
  479.  
  480. ;———————————————————————————————————————————————————————————
  481. ; Absolute value.
  482. ;———————————————————————————————————————————————————————————
  483.         MACRO
  484.         FABSX
  485.         bclr.b    #7,([sp])
  486.         addq.l    #4,sp
  487.         ENDM
  488.  
  489. ;———————————————————————————————————————————————————————————
  490. ; Next-after.  NOTE: both operands are of the same
  491. ; format, as specified by the usual suffix.
  492. ;———————————————————————————————————————————————————————————
  493.         MACRO
  494.         FNEXTS
  495.         jsr     _fprocENTRYsp
  496.         MOVE.W    #FFSGL+FONEXT,-(SP)
  497.         _FP68K
  498.         jsr     _fprocEXITsp
  499.         ENDM
  500.  
  501.         MACRO
  502.         FNEXTD
  503.         jsr     _fprocENTRYsp
  504.         MOVE.W    #FFDBL+FONEXT,-(SP)
  505.         _FP68K
  506.         jsr     _fprocEXITsp
  507.         ENDM
  508.  
  509.         MACRO
  510.         FNEXTX
  511.         jsr     _fprocENTRYsp
  512.         move.w    ([sp]),([sp],2)
  513.         addq.l    #2,(sp)
  514.         move.w    ([4,sp]),([4,sp],2)
  515.         addq.l    #2,4(sp)
  516.         MOVE.W    #FFEXT+FONEXT,-(SP)
  517.         _FP68K
  518.         fmove.x fp0,([16,sp])
  519.         jsr     _fprocEXITsp
  520.         ENDM
  521.  
  522. ;———————————————————————————————————————————————————————————
  523. ; Conversion to extended.
  524. ;———————————————————————————————————————————————————————————
  525.         MACRO
  526.         FX2X
  527.         fmove.x ([4,sp]),fp0
  528.         fmove.x fp0,([sp])
  529.         addq.l    #8,sp
  530.         ENDM
  531.  
  532.         MACRO
  533.         FD2X
  534.         fmove.d ([4,sp]),fp0
  535.         fmove.x fp0,([sp])
  536.         addq.l    #8,sp
  537.         ENDM
  538.  
  539.         MACRO
  540.         FS2X
  541.         fmove.s ([4,sp]),fp0
  542.         fmove.x fp0,([sp])
  543.         addq.l    #8,sp
  544.         ENDM
  545.  
  546.         MACRO
  547.         FI2X
  548.         fmove.w ([4,sp]),fp0
  549.         fmove.x fp0,([sp])
  550.         addq.l    #8,sp
  551.         ENDM
  552.  
  553.         MACRO
  554.         FL2X
  555.         fmove.l ([4,sp]),fp0
  556.         fmove.x fp0,([sp])
  557.         addq.l    #8,sp
  558.         ENDM
  559.  
  560.         MACRO
  561.         FC2X
  562.         jsr _FC2X
  563.         addq    #8,sp
  564.         ENDM
  565.  
  566. ;———————————————————————————————————————————————————————————
  567. ; Conversion from extended.
  568. ;———————————————————————————————————————————————————————————
  569.         MACRO
  570.         FX2D
  571.         fmove.x ([4,sp]),fp0
  572.         fmove.d fp0,([sp])
  573.         addq.l    #8,sp
  574.         ENDM
  575.  
  576.         MACRO
  577.         FX2S
  578.         fmove.x ([4,sp]),fp0
  579.         fmove.s fp0,([sp])
  580.         addq.l    #8,sp
  581.         ENDM
  582.  
  583.         MACRO
  584.         FX2I
  585.         fmove.x ([4,sp]),fp0
  586.         fmove.w fp0,([sp])
  587.         addq.l    #8,sp
  588.         ENDM
  589.  
  590.         MACRO
  591.         FX2L
  592.         fmove.x ([4,sp]),fp0
  593.         fmove.l fp0,([sp])
  594.         addq.l    #8,sp
  595.         ENDM
  596.  
  597.         MACRO
  598.         FX2C
  599.         jsr     _fprocENTRYsp
  600.         move.w    ([4,sp]),([4,sp],2)
  601.         addq.l    #2,4(sp)
  602.         MOVE.W    #FFCOMP+FOX2Z,-(SP)
  603.         _FP68K
  604.         jsr     _fprocEXITsp
  605.         ENDM
  606.  
  607. ;———————————————————————————————————————————————————————————
  608. ; Binary to decimal conversion.
  609. ;———————————————————————————————————————————————————————————
  610.         MACRO
  611.         FX2DEC
  612.         jsr     _fprocENTRYsp
  613.         move.l    12(sp),16(sp)
  614.         move.l    8(sp),12(sp)
  615.         move.l    28(sp),8(sp)
  616.         move.w    ([4,sp]),([4,sp],2)
  617.         addq.l    #2,4(sp)
  618.         MOVE.W    #FFEXT+FOB2D,-(SP)
  619.         _FP68K
  620.         jsr     _fprocEXITsp
  621.         ENDM
  622.  
  623.         MACRO
  624.         FD2DEC
  625.         jsr     _fprocENTRYsp
  626.         move.l    12(sp),16(sp)
  627.         move.l    8(sp),12(sp)
  628.         move.l    28(sp),8(sp)
  629.         MOVE.W    #FFDBL+FOB2D,-(SP)
  630.         _FP68K
  631.         jsr     _fprocEXITsp
  632.         ENDM
  633.  
  634.         MACRO
  635.         FS2DEC
  636.         jsr     _fprocENTRYsp
  637.         move.l    12(sp),16(sp)
  638.         move.l    8(sp),12(sp)
  639.         move.l    28(sp),8(sp)
  640.         MOVE.W    #FFSGL+FOB2D,-(SP)
  641.         _FP68K
  642.         jsr     _fprocEXITsp
  643.         ENDM
  644.  
  645.         MACRO
  646.         FC2DEC
  647.         jsr     _fprocENTRYsp
  648.         move.l    12(sp),16(sp)
  649.         move.l    8(sp),12(sp)
  650.         move.l    28(sp),8(sp)
  651.         MOVE.W    #FFCOMP+FOB2D,-(SP)
  652.         _FP68K
  653.         jsr     _fprocEXITsp
  654.         ENDM
  655.  
  656.         MACRO
  657.         FI2DEC
  658.         jsr     _fprocENTRYsp
  659.         move.l    12(sp),16(sp)
  660.         move.l    8(sp),12(sp)
  661.         move.l    28(sp),8(sp)
  662.         MOVE.W    #FFINT+FOB2D,-(SP)
  663.         _FP68K
  664.         jsr     _fprocEXITsp
  665.         ENDM
  666.  
  667.         MACRO
  668.         FL2DEC
  669.         jsr     _fprocENTRYsp
  670.         move.l    12(sp),16(sp)
  671.         move.l    8(sp),12(sp)
  672.         move.l    28(sp),8(sp)
  673.         MOVE.W    #FFLNG+FOB2D,-(SP)
  674.         _FP68K
  675.         jsr     _fprocEXITsp
  676.         ENDM
  677.  
  678. ;———————————————————————————————————————————————————————————
  679. ; Decimal to binary conversion.
  680. ;———————————————————————————————————————————————————————————
  681.         MACRO
  682.         FDEC2X
  683.         jsr     _fprocENTRYsp
  684.         addq.l    #2,(sp)
  685.         MOVE.W    #FFEXT+FOD2B,-(SP)
  686.         _FP68K
  687.         move.w    ([12,sp],2),([12,sp])
  688.         jsr     _fprocEXITsp
  689.         ENDM
  690.  
  691.         MACRO
  692.         FDEC2D
  693.         jsr     _fprocENTRYsp
  694.         MOVE.W    #FFDBL+FOD2B,-(SP)
  695.         _FP68K
  696.         jsr     _fprocEXITsp
  697.         ENDM
  698.  
  699.         MACRO
  700.         FDEC2S
  701.         jsr     _fprocENTRYsp
  702.         MOVE.W    #FFSGL+FOD2B,-(SP)
  703.         _FP68K
  704.         jsr     _fprocEXITsp
  705.         ENDM
  706.  
  707.         MACRO
  708.         FDEC2C
  709.         jsr     _fprocENTRYsp
  710.         MOVE.W    #FFCOMP+FOD2B,-(SP)
  711.         _FP68K
  712.         jsr     _fprocEXITsp
  713.         ENDM
  714.  
  715.         MACRO
  716.         FDEC2I
  717.         jsr     _fprocENTRYsp
  718.         MOVE.W    #FFINT+FOD2B,-(SP)
  719.         _FP68K
  720.         jsr     _fprocEXITsp
  721.         ENDM
  722.  
  723.         MACRO
  724.         FDEC2L
  725.         jsr     _fprocENTRYsp
  726.         MOVE.W    #FFLNG+FOD2B,-(SP)
  727.         _FP68K
  728.         jsr     _fprocEXITsp
  729.         ENDM
  730.  
  731. ;———————————————————————————————————————————————————————————
  732. ; Compare, not signaling invalid on unordered.    INCOMPATIBILITY: doesn't set 020's CCR
  733. ;———————————————————————————————————————————————————————————
  734.         MACRO
  735.         FCMPX
  736.         fmove.x ([sp]),fp0
  737.         fcmp.x    ([4,sp]),fp0
  738.         addq.l    #8,sp
  739.         ENDM
  740.  
  741.         MACRO
  742.         FCMPD
  743.         fmove.x ([sp]),fp0
  744.         fcmp.d    ([4,sp]),fp0
  745.         addq.l    #8,sp
  746.         ENDM
  747.  
  748.         MACRO
  749.         FCMPS
  750.         fmove.x ([sp]),fp0
  751.         fcmp.s    ([4,sp]),fp0
  752.         addq.l    #8,sp
  753.         ENDM
  754.  
  755.         MACRO
  756.         FCMPC
  757.         fmovem.x    ([sp]),fp1
  758.         jsr _FC2X
  759.         fcmp.x    fp0,fp1
  760.         fmovem.x    fp1,([sp])
  761.         addq.l    #8,sp
  762.         ENDM
  763.  
  764.         MACRO
  765.         FCMPI
  766.         fmove.x ([sp]),fp0
  767.         fcmp.w    ([4,sp]),fp0
  768.         addq.l    #8,sp
  769.         ENDM
  770.  
  771.         MACRO
  772.         FCMPL
  773.         fmove.x ([sp]),fp0
  774.         fcmp.l    ([4,sp]),fp0
  775.         addq.l    #8,sp
  776.         ENDM
  777.  
  778. ;———————————————————————————————————————————————————————————
  779. ; Compare, signaling invalid on unordered.    INCOMPATIBILITY: doesn't set 020's CCR
  780. ;———————————————————————————————————————————————————————————
  781.         MACRO
  782.         FCPXX
  783.         fmove.x ([sp]),fp0
  784.         fcmp.x    ([4,sp]),fp0
  785.         addq.l    #8,sp
  786.         fbsf.w    *+2
  787.         ENDM
  788.  
  789.         MACRO
  790.         FCPXD
  791.         fmove.x ([sp]),fp0
  792.         fcmp.d    ([4,sp]),fp0
  793.         addq.l    #8,sp
  794.         fbsf.w    *+2
  795.         ENDM
  796.  
  797.         MACRO
  798.         FCPXS
  799.         fmove.x ([sp]),fp0
  800.         fcmp.s    ([4,sp]),fp0
  801.         addq.l    #8,sp
  802.         fbsf.w    *+2
  803.         ENDM
  804.  
  805.         MACRO
  806.         FCPXC
  807.         fmove.x ([sp]),fp1
  808.         jsr _FC2X
  809.         fcmp.x    fp0,fp1
  810.         fmovem.x    fp1,([sp])
  811.         addq.l    #8,sp
  812.         fbsf.w    *+2
  813.         ENDM
  814.  
  815.         MACRO
  816.         FCPXI
  817.         fmove.x ([sp]),fp0
  818.         fcmp.w    ([4,sp]),fp0
  819.         addq.l    #8,sp
  820.         fbsf.w    *+2
  821.         ENDM
  822.  
  823.         MACRO
  824.         FCPXL
  825.         fmove.x ([sp]),fp0
  826.         fcmp.l    ([4,sp]),fp0
  827.         addq.l    #8,sp
  828.         fbsf.w    *+2
  829.         ENDM
  830.  
  831. ;———————————————————————————————————————————————————————————
  832. ; The following defines a set of so-called floating
  833. ; branches.  They presume that the appropriate compare
  834. ; operation, FCMPz or FCPXz, precedes.
  835. ;———————————————————————————————————————————————————————————
  836.         MACRO
  837.         FBEQL
  838.         FBEQ.L    &SYSLIST[1]
  839.         ENDM
  840.  
  841.         MACRO
  842.         FBLTL
  843.         FBOLT.L     &SYSLIST[1]
  844.         ENDM
  845.  
  846.         MACRO
  847.         FBLEL
  848.         FBOLE.L     &SYSLIST[1]
  849.         ENDM
  850.  
  851.         MACRO
  852.         FBGTL
  853.         FBOGT.L     &SYSLIST[1]
  854.         ENDM
  855.  
  856.         MACRO
  857.         FBGEL
  858.         FBOGE.L     &SYSLIST[1]
  859.         ENDM
  860.  
  861.         MACRO
  862.         FBULTL
  863.         FBULT.L     &SYSLIST[1]
  864.         ENDM
  865.  
  866.         MACRO
  867.         FBULEL
  868.         FBULE.L     &SYSLIST[1]
  869.         ENDM
  870.  
  871.         MACRO
  872.         FBUGTL
  873.         FBUGT.L     &SYSLIST[1]
  874.         ENDM
  875.  
  876.         MACRO
  877.         FBUGEL
  878.         FBUGE.L     &SYSLIST[1]
  879.         ENDM
  880.  
  881.         MACRO
  882.         FBUL
  883.         FBUN.L    &SYSLIST[1]
  884.         ENDM
  885.  
  886.         MACRO
  887.         FBOL
  888.         FBOR.L    &SYSLIST[1]
  889.         ENDM
  890.  
  891.         MACRO
  892.         FBNEL
  893.         FBNE.L    &SYSLIST[1]
  894.         ENDM
  895.  
  896.         MACRO
  897.         FBUEL
  898.         FBUEQ.L     &SYSLIST[1]
  899.         ENDM
  900.  
  901.         MACRO
  902.         FBLGL
  903.         FBOGL.L     &SYSLIST[1]
  904.         ENDM
  905.  
  906. ;———————————————————————————————————————————————————————————
  907. ; Short branch versions.
  908. ;———————————————————————————————————————————————————————————
  909.         MACRO
  910.         FBEQS
  911.         FBEQ.W    &SYSLIST[1]
  912.         ENDM
  913.  
  914.         MACRO
  915.         FBLTS
  916.         FBOLT.W &SYSLIST[1]
  917.         ENDM
  918.  
  919.         MACRO
  920.         FBLES
  921.         FBOLE.W &SYSLIST[1]
  922.         ENDM
  923.  
  924.         MACRO
  925.         FBGTS
  926.         FBOGT.W &SYSLIST[1]
  927.         ENDM
  928.  
  929.         MACRO
  930.         FBGES
  931.         FBOGE.W &SYSLIST[1]
  932.         ENDM
  933.  
  934.         MACRO
  935.         FBULTS
  936.         FBULT.W &SYSLIST[1]
  937.         ENDM
  938.  
  939.         MACRO
  940.         FBULES
  941.         FBULE.W &SYSLIST[1]
  942.         ENDM
  943.  
  944.         MACRO
  945.         FBUGTS
  946.         FBUGT.W &SYSLIST[1]
  947.         ENDM
  948.  
  949.         MACRO
  950.         FBUGES
  951.         FBUGE.W &SYSLIST[1]
  952.         ENDM
  953.  
  954.         MACRO
  955.         FBUS
  956.         FBUN.W    &SYSLIST[1]
  957.         ENDM
  958.  
  959.         MACRO
  960.         FBOS
  961.         FBOR.W    &SYSLIST[1]
  962.         ENDM
  963.  
  964.         MACRO
  965.         FBNES
  966.         FBNE.W    &SYSLIST[1]
  967.         ENDM
  968.  
  969.         MACRO
  970.         FBUES
  971.         FBUEQ.W &SYSLIST[1]
  972.         ENDM
  973.  
  974.         MACRO
  975.         FBLGS
  976.         FBOGL.W &SYSLIST[1]
  977.         ENDM
  978.  
  979. ;———————————————————————————————————————————————————————————
  980. ; Class and sign inquiries.
  981. ;———————————————————————————————————————————————————————————
  982. FCSNAN            EQU  1     ; signaling NAN
  983. FCQNAN            EQU  2     ; quiet NAN
  984. FCINF            EQU  3     ; infinity
  985. FCZERO            EQU  4     ; zero
  986. FCNORM            EQU  5     ; normal number
  987. FCDENORM        EQU  6     ; denormal number
  988.  
  989.         MACRO
  990.         FCLASSS
  991.         MOVE.W    #FFSGL+FOCLASS,-(SP)
  992.         _FP68K
  993.         ENDM
  994.  
  995.         MACRO
  996.         FCLASSD
  997.         MOVE.W    #FFDBL+FOCLASS,-(SP)
  998.         _FP68K
  999.         ENDM
  1000.  
  1001.         MACRO
  1002.         FCLASSX
  1003.         MOVE.W    ([4,SP]),([4,SP],2)
  1004.         ADDQ.L    #2,4(SP)
  1005.         MOVE.W    #FFEXT+FOCLASS,-(SP)
  1006.         _FP68K
  1007.         ENDM
  1008.  
  1009.         MACRO
  1010.         FCLASSC
  1011.         MOVE.W    #FFCOMP+FOCLASS,-(SP)
  1012.         _FP68K
  1013.         ENDM
  1014.  
  1015. ;———————————————————————————————————————————————————————————
  1016. ; Bit indexes for bytes of floating point environment word.
  1017. ;———————————————————————————————————————————————————————————
  1018. FBINVALID        EQU  0     ; invalid operation
  1019. FBUFLOW         EQU  1     ; underflow
  1020. FBOFLOW         EQU  2     ; overflow
  1021. FBDIVZER        EQU  3     ; division by zero
  1022. FBINEXACT        EQU  4     ; inexact
  1023. FBRNDLO         EQU  5     ; low bit of rounding mode
  1024. FBRNDHI         EQU  6     ; high bit of rounding mode
  1025. FBLSTRND        EQU  7     ; last round result bit
  1026. FBDBL            EQU  5     ; double precision control
  1027. FBSGL            EQU  6     ; single precision control
  1028.  
  1029. ;———————————————————————————————————————————————————————————
  1030. ; Get and set environment.
  1031. ;———————————————————————————————————————————————————————————
  1032.         MACRO
  1033.         FGETENV
  1034.         MOVE.W    #FOGETENV,-(SP)
  1035.         _FP68K
  1036.         ENDM
  1037.  
  1038.         MACRO
  1039.         FSETENV
  1040.         MOVE.W    #FOSETENV,-(SP)
  1041.         _FP68K
  1042.         ENDM
  1043.  
  1044. ;———————————————————————————————————————————————————————————
  1045. ; Test and set exception.
  1046. ;———————————————————————————————————————————————————————————
  1047.         MACRO
  1048.         FTESTXCP
  1049.         MOVE.W    #FOTESTXCP,-(SP)
  1050.         _FP68K
  1051.         ENDM
  1052.  
  1053.         MACRO
  1054.         FSETXCP
  1055.         move.l    (sp),-(sp)
  1056.         jsr     _fprocENTRYsp
  1057.         MOVE.W    #FOSETXCP,-(SP)
  1058.         _FP68K
  1059.         clr.l    (sp)+
  1060.         jsr     _fprocEXITsp
  1061.         ENDM
  1062.  
  1063. ;———————————————————————————————————————————————————————————
  1064. ; Procedure entry and exit.
  1065. ;———————————————————————————————————————————————————————————
  1066.         MACRO
  1067.         FPROCENTRY
  1068.         MOVE.W    #FOPROCENTRY,-(SP)
  1069.         _FP68K
  1070.         ENDM
  1071.  
  1072.         MACRO
  1073.         FPROCEXIT
  1074.         move.l    (sp),-(sp)
  1075.         jsr     _fprocENTRYsp
  1076.         MOVE.W    #FOPROCEXIT,-(SP)
  1077.         _FP68K
  1078.         clr.l    (sp)+
  1079.         jsr     _fprocEXITsp
  1080.         ENDM
  1081.  
  1082. ;———————————————————————————————————————————————————————————
  1083. ; Get and set halt vector.
  1084. ;———————————————————————————————————————————————————————————
  1085.         MACRO
  1086.         FGETHV
  1087.         MOVE.W    #FOGETHV,-(SP)
  1088.         _FP68K
  1089.         ENDM
  1090.  
  1091.         MACRO
  1092.         FSETHV
  1093.         move.l    ([sp]),$0c0
  1094.         move.l    ([sp]),$0c4
  1095.         move.l    ([sp]),$0c8
  1096.         move.l    ([sp]),$0cc
  1097.         move.l    ([sp]),$0d0
  1098.         move.l    ([sp]),$0d4
  1099.         move.l    ([sp]),$0d8
  1100.         MOVE.W    #FOSETHV,-(SP)
  1101.         _FP68K
  1102.         ENDM
  1103.  
  1104.  
  1105.  
  1106. ;———————————————————————————————————————————————————————————
  1107. ; Elementary function operation code masks.
  1108. ;———————————————————————————————————————————————————————————
  1109. FOLNX            EQU  $0000     ; base-e log
  1110. FOLOG2X         EQU  $0002     ; base-2 log
  1111. FOLN1X            EQU  $0004     ; ln (1 + x)
  1112. FOLOG21X        EQU  $0006     ; log2 (1 + x)
  1113.  
  1114. FOEXPX            EQU  $0008     ; base-e exponential
  1115. FOEXP2X         EQU  $000A     ; base-2 exponential
  1116. FOEXP1X         EQU  $000C     ; exp (x) - 1
  1117. FOEXP21X        EQU  $000E     ; exp2 (x) - 1
  1118.  
  1119. FOXPWRI         EQU  $8010     ; integer exponentiation
  1120. FOXPWRY         EQU  $8012     ; general exponentiation
  1121. FOCOMPOUND        EQU  $C014     ; compound
  1122. FOANNUITY        EQU  $C016     ; annuity
  1123.  
  1124. FOSINX            EQU  $0018     ; sine
  1125. FOCOSX            EQU  $001A     ; cosine
  1126. FOTANX            EQU  $001C     ; tangent
  1127. FOATANX         EQU  $001E     ; arctangent
  1128. FORANDX         EQU  $0020     ; random
  1129.  
  1130. ;———————————————————————————————————————————————————————————
  1131. ; Elementary functions.
  1132. ;———————————————————————————————————————————————————————————
  1133.         MACRO
  1134.         FLNX             ; base-e log
  1135.         flogn.x ([sp]),fp0
  1136.         fmove.x fp0,([sp])
  1137.         addq.l    #4,sp
  1138.         ENDM
  1139.  
  1140.         MACRO
  1141.         FLOG2X             ; base-2 log
  1142.         flog2.x ([sp]),fp0
  1143.         fmove.x fp0,([sp])
  1144.         addq.l    #4,sp
  1145.         ENDM
  1146.  
  1147.         MACRO
  1148.         FLN1X             ; ln (1 + x)
  1149.         flognp1.x    ([sp]),fp0
  1150.         fmove.x fp0,([sp])
  1151.         addq.l    #4,sp
  1152.         ENDM
  1153.  
  1154.         MACRO
  1155.         FLOG21X          ; log2 (1 + x)
  1156.         move.l    (sp),-(sp)
  1157.         jsr     _fprocENTRYsp
  1158.         move.w    ([sp]),([sp],2)
  1159.         addq.l    #2,(sp)
  1160.         MOVE.W    #FOLOG21X,-(SP)
  1161.         _ELEMS68K
  1162.         move.w    ([sp],2),([sp])
  1163.         clr.l    (sp)+
  1164.         jsr     _fprocEXITsp
  1165.         ENDM
  1166.  
  1167.         MACRO
  1168.         FEXPX             ; base-e exponential
  1169.         fetox.x ([sp]),fp0
  1170.         fmove.x fp0,([sp])
  1171.         addq.l    #4,sp
  1172.         ENDM
  1173.  
  1174.         MACRO
  1175.         FEXP2X             ; base-2 exponential
  1176.         ftwotox.x    ([sp]),fp0
  1177.         fmove.x fp0,([sp])
  1178.         addq.l    #4,sp
  1179.         ENDM
  1180.  
  1181.         MACRO
  1182.         FEXP1X             ; exp (x) - 1
  1183.         fetoxm1.x    ([sp]),fp0
  1184.         fmove.x fp0,([sp])
  1185.         addq.l    #4,sp
  1186.         ENDM
  1187.  
  1188.         MACRO
  1189.         FEXP21X          ; exp2 (x) - 1
  1190.         move.l    (sp),-(sp)
  1191.         jsr     _fprocENTRYsp
  1192.         move.w    ([sp]),([sp],2)
  1193.         addq.l    #2,(sp)
  1194.         MOVE.W    #FOEXP21X,-(SP)
  1195.         _ELEMS68K
  1196.         move.w    ([sp],2),([sp])
  1197.         clr.l    (sp)+
  1198.         jsr     _fprocEXITsp
  1199.         ENDM
  1200.  
  1201.         MACRO
  1202.         FXPWRI             ; integer exponential
  1203.         jsr     _fprocENTRYsp
  1204.         move.w    ([sp]),([sp],2)
  1205.         addq.l    #2,(sp)
  1206.         MOVE.W    #FOXPWRI,-(SP)
  1207.         _ELEMS68K
  1208.         move.w    ([12,sp],2),([12,sp])
  1209.         jsr     _fprocEXITsp
  1210.         ENDM
  1211.  
  1212.         MACRO
  1213.         FXPWRY             ; general exponential
  1214.         jsr     _fprocENTRYsp
  1215.         move.w    ([4,sp]),([4,sp],2)
  1216.         addq.l    #2,4(sp)
  1217.         move.w    ([sp]),([sp],2)
  1218.         addq.l    #2,(sp)
  1219.         MOVE.W    #FOXPWRY,-(SP)
  1220.         _ELEMS68K
  1221.         move.w    ([12,sp],2),([12,sp])
  1222.         jsr     _fprocEXITsp
  1223.         ENDM
  1224.  
  1225.         MACRO
  1226.         FCOMPOUND          ; compound
  1227.         jsr     _fprocENTRYsp
  1228.         move.l    12(sp),16(sp)
  1229.         move.l    8(sp),12(sp)
  1230.         move.l    28(sp),8(sp)
  1231.         move.w    ([sp]),([sp],2)
  1232.         addq.l    #2,(sp)
  1233.         move.w    ([4,sp]),([4,sp],2)
  1234.         addq.l    #2,4(sp)
  1235.         move.w    ([8,sp]),([8,sp],2)
  1236.         addq.l    #2,8(sp)
  1237.         MOVE.W    #FOCOMPOUND,-(SP)
  1238.         _ELEMS68K
  1239.         move.w    ([8,sp],2),([8,sp])
  1240.         jsr     _fprocEXITsp
  1241.         ENDM
  1242.  
  1243.         MACRO
  1244.         FANNUITY         ; annuity
  1245.         jsr     _fprocENTRYsp
  1246.         move.l    12(sp),16(sp)
  1247.         move.l    8(sp),12(sp)
  1248.         move.l    28(sp),8(sp)
  1249.         move.w    ([sp]),([sp],2)
  1250.         addq.l    #2,(sp)
  1251.         move.w    ([4,sp]),([4,sp],2)
  1252.         addq.l    #2,4(sp)
  1253.         move.w    ([8,sp]),([8,sp],2)
  1254.         addq.l    #2,8(sp)
  1255.         MOVE.W    #FOANNUITY,-(SP)
  1256.         _ELEMS68K
  1257.         move.w    ([8,sp],2),([8,sp])
  1258.         jsr     _fprocEXITsp
  1259.         ENDM
  1260.  
  1261.         MACRO
  1262.         FSINX             ; sine
  1263.         fsin.x    ([sp]),fp0
  1264.         fmove.x fp0,([sp])
  1265.         addq.l    #4,sp
  1266.         ENDM
  1267.  
  1268.         MACRO
  1269.         FCOSX             ; cosine
  1270.         fcos.x    ([sp]),fp0
  1271.         fmove.x fp0,([sp])
  1272.         addq.l    #4,sp
  1273.         ENDM
  1274.  
  1275.         MACRO
  1276.         FTANX             ; tangent
  1277.         ftan.x    ([sp]),fp0
  1278.         fmove.x fp0,([sp])
  1279.         addq.l    #4,sp
  1280.         ENDM
  1281.  
  1282.         MACRO
  1283.         FATANX             ; arctangent
  1284.         fatan.x ([sp]),fp0
  1285.         fmove.x fp0,([sp])
  1286.         addq.l    #4,sp
  1287.         ENDM
  1288.  
  1289.         MACRO
  1290.         FRANDX             ; random number generator
  1291.         move.l    (sp),-(sp)
  1292.         jsr     _fprocENTRYsp
  1293.         move.w    ([sp]),([sp],2)
  1294.         addq.l    #2,(sp)
  1295.         MOVE.W    #FORANDX,-(SP)
  1296.         _ELEMS68K
  1297.         move.w    ([sp],2),([sp])
  1298.         clr.l    (sp)+
  1299.         jsr     _fprocEXITsp
  1300.         ENDM
  1301.  
  1302. ;———————————————————————————————————————————————————————————
  1303. ; Scanner and formatter operation code masks
  1304. ;———————————————————————————————————————————————————————————
  1305.  
  1306. FOPSTR2DEC        EQU     $0002    ;Pascal string to decimal record
  1307. FOCSTR2DEC        EQU     $0004    ;C string to decimal record
  1308. FODEC2STR        EQU     $0003    ;decimal record to Pascal string
  1309.  
  1310. ;———————————————————————————————————————————————————————————
  1311. ; Scanner and formatter functions
  1312. ;———————————————————————————————————————————————————————————
  1313.  
  1314. ;Pascal string to decimal record
  1315.  
  1316.     MACRO
  1317.     FPSTR2DEC
  1318.     MOVE.W    #FOPSTR2DEC, -(SP)
  1319.     _DecStr68K
  1320.     ENDM
  1321.  
  1322. ;C string to decimal record
  1323.  
  1324.     MACRO
  1325.     FCSTR2DEC
  1326.     MOVE.W    #FOCSTR2DEC, -(SP)
  1327.     _DecStr68K
  1328.     ENDM
  1329.  
  1330. ;decimal record to Pascal string
  1331.  
  1332.     MACRO
  1333.     FDEC2STR
  1334.     MOVE.W    #FODEC2STR, -(SP)
  1335.     _DecStr68K
  1336.     ENDM
  1337.  
  1338.  
  1339.  
  1340. ;———————————————————————————————————————————————————————————
  1341. ; NaN codes.
  1342. ;———————————————————————————————————————————————————————————
  1343. NANSQRT         EQU  1     ; Invalid square root such as sqrt(-1).
  1344. NANADD            EQU  2     ; Invalid addition such as +INF - +INF.
  1345. NANDIV            EQU  4     ; Invalid division such as 0/0.
  1346. NANMUL            EQU  8     ; Invalid multiply such as 0 * INF.
  1347. NANREM            EQU  9     ; Invalid remainder or mod such as x REM 0.
  1348. NANASCBIN        EQU  17  ; Attempt to convert invalid ASCII string.
  1349. NANCOMP         EQU  20  ; Result of converting comp NaN to floating.
  1350. NANZERO         EQU  21  ; Attempt to create a NaN with a zero code.
  1351. NANTRIG         EQU  33  ; Invalid argument to trig routine.
  1352. NANINVTRIG        EQU  34  ; Invalid argument to inverse trig routine.
  1353. NANLOG            EQU  36  ; Invalid argument to log routine.
  1354. NANPOWER        EQU  37  ; Invalid argument to x^i or x^y routine.
  1355. NANFINAN        EQU  38  ; Invalid argument to financial function.
  1356. NANINIT         EQU  255     ; Uninitialized storage.
  1357.  
  1358. *
  1359. *  _FC2X converts a comp to a 96 bit extended;
  1360. *  push comp addr, then push destination addr, then jsr _FC2X .
  1361. *  The addresses are NOT popped for you, i.e. the call is C style.
  1362. *
  1363. *  The extended result is also left in fp0.
  1364. *
  1365. *  All data and address registers are preserved.
  1366. *
  1367. _FC2X        PROC
  1368.             movem.l d0-d1,-(sp)
  1369.             movem.l ([16,sp]),d0-d1
  1370.             tst.l    d1
  1371.             bgt.s    @1
  1372.             beq.s    @3
  1373.             addq.l    #1,d0
  1374. @1            fmove.l d0,fp0
  1375.             fscale.w    #32,fp0
  1376.             fadd.l    d1,fp0
  1377.             bvc.s        @2
  1378.             fadd.s    #"$5f800000",fp0
  1379. @2            movem.l (sp)+,d0-d1
  1380.             fmove.x fp0,([4,sp])
  1381.             rts
  1382. @3            neg.l    d0
  1383.             bvs.s    @4
  1384.             neg.l    d0
  1385.             bra.s    @1
  1386. @4            fmove.s #"nan(20)",fp0
  1387.             bra.s    @2
  1388.             ENDPROC
  1389.  
  1390. ;———————————————————————————————————————————————————————————
  1391. ; Procentry Special Macro. (Stack-based environment; doesn't change rnd and prec.)
  1392. ;———————————————————————————————————————————————————————————
  1393.         MACRO
  1394.         FPROCENTRYSP
  1395.         fmovem.l    fpcr/fpsr,-(sp)
  1396.         clr.l    -(sp)
  1397.         move.l    4(sp),-(sp)
  1398.         and.l    #$ff,(sp)
  1399.         fmovem.l    (sp)+,fpcr/fpsr
  1400.         ENDM
  1401.  
  1402. *
  1403. *  Subroutines _fprocENTRYsp and _fprocEXITsp bracket two argument SANE ROM calls,
  1404. *  causing their software exceptions to happen in hardware.
  1405. *
  1406. *  ENTRY:    STACK:    rtnaddr < DSTaddr < SRCaddr
  1407. *  EXIT:    STACK:    DSTaddr < SRCaddr < FPCR < FPSR < (0).L < DSTaddr < SRCaddr
  1408. *
  1409. *  All data and address registers are preserved.  FP1 is scratched.
  1410. *
  1411. _fprocENTRYsp    PROC
  1412.             fmovem.l        (sp)+,fpiar
  1413.     
  1414.             clr.l    -(sp)
  1415.             fmovem    (sp),fp0
  1416.             FPROCENTRYSP
  1417.             fmovem    fp0,-(sp)
  1418.             clr.l    (sp)+
  1419.     
  1420.             fmovem.l        fpiar,-(sp)
  1421.             rts
  1422.             ENDPROC
  1423.             
  1424. *
  1425. *  Subroutines _fprocEXITsp and _fprocENTRYsp bracket two argument SANE ROM calls,
  1426. *  causing their software exceptions to happen in hardware.
  1427. *
  1428. *  ENTRY:    STACK:    rtnaddr < FPCR < FPSR < (0).L < DSTaddr < SRCaddr
  1429. *  EXIT:    STACK:
  1430. *
  1431. *  All data and address registers are preserved.  FP1 is scratched.
  1432. *
  1433. _fprocEXITsp    PROC
  1434.             FMOVE.W D1,FP1
  1435.             FMOVE.L FPSR,-(SP)
  1436.             MOVE.W    2(SP),D1
  1437.             CLR.L    (SP)+
  1438.             FMOVEM.L    4(SP),FPCR/FPSR
  1439.             
  1440.             OR.W    D1,10(SP)
  1441.             AND.W    5(SP),D1    ; Yes, 5
  1442.             FMOVE.L 8(SP),FPSR
  1443.             
  1444.             TST.B    D1
  1445.             BEQ.S    @1
  1446.             FNOP
  1447.             NOP
  1448.             FSAVE    -(SP)
  1449.             CLR.W    D1
  1450.             MOVE.B    1(SP),D1
  1451.             BCLR    #3,(SP,D1.W)
  1452.             FRESTORE    (SP)+
  1453.             FNOP
  1454. @1            FMOVE.W FP1,D1
  1455.             MOVE.L    (SP),20(SP)
  1456.             ADDA.W    #20,SP
  1457.             RTS
  1458.             ENDPROC
  1459.